package controller

import (
	"ginApi/comm"
	"ginApi/model"
	"ginApi/service"
	"ginApi/vo"
	"github.com/gin-gonic/gin"
)

type UserController struct {
	ServiceUser  service.UserService
	ServiceToken service.TokenService
}

// @Summary 用户注册
// @Accept json
// @Tags 用户管理
// @Produce  json
// @Param UserForm body vo.UserForm true "注册表单"
// @Success 200
// @Router /user/register [post]
func (u *UserController) Register(c *gin.Context) {
	var form vo.UserForm
	if err := c.ShouldBind(&form); err != nil {
		comm.Fail(c, comm.ErrorParamFormat, err.Error())
		return
	}

	if user, err := u.ServiceUser.Register(form.Username, form.Password); err != nil {
		comm.Fail(c, err.Code, err.Error.Error())
	} else {
		data := map[string]interface{}{"user_id": user.ID}
		comm.Success(c, data)
	}
}

// @Summary 用户登录
// @Accept json
// @Tags 用户管理
// @Produce  json
// @Param UserForm body vo.UserForm true "登录表单"
// @Success 200
// @Router /user/login [post]
func (u *UserController) Login(c *gin.Context) {
	var form vo.UserForm
	if err := c.ShouldBind(&form); err != nil {
		comm.Fail(c, comm.ErrorParamFormat, err.Error())
		return
	}

	if user, err := u.ServiceUser.Login(form.Username, form.Password); err != nil {
		comm.Fail(c, err.Code, err.Error.Error())
	} else {
		var token string
		entity := u.ServiceToken.GetTokenById(user.ID)

		if entity != nil && entity.ID > 0 {
			token = entity.Token
		} else {
			tokenModel := u.ServiceToken.Insert(user.ID, model.TokenUserTypeUser)
			token = tokenModel.Token
		}

		data := map[string]interface{}{"user": user, "token": token}
		comm.Success(c, data)
	}
}

// @Summary 用户登出
// @Accept json
// @Tags 用户管理
// @Produce  json
// @Param token path string true "票据"
// @Success 200
// @Router /user/logout [post]
func (u *UserController) Logout(c *gin.Context) {
	token, _ := c.Params.Get("token")
	if err := u.ServiceToken.DeleteToken(token); err != nil {
		comm.Fail(c, err.Code, err.Error.Error())
	}

	c.Set("user_id", 0)
	c.Set("user_type", 0)
	comm.Success(c, "登出成功")
}
